package com.yzs.core.http

import com.google.gson.JsonElement
import com.yzs.core.utils.fromJson
import com.yzs.core.utils.fromJsonList
import com.yzs.core.utils.fromJsonToListModel
import java.lang.reflect.Type

/**
 *    author : yzs
 *    date   : 2022/1/1211:50
 *    desc   : 使用万能适配 JsonElement 类型，使用泛型 <T> 或者 String 不能直接转化
 */

class CodeConstant {
    companion object {
        const val ERROR_CODE_UNKNOWN = -1
        const val HTTP_SUCCESS = 200
        const val ERROR_LOCAL = -11
        const val ERROR_DATA_NULL = -12
        const val ERROR_TOKEN_INVALIDATION = -1000
        const val ERROR_COMMON_CODE = -1100 //
    }
}

class ApiResponse(val code: Int, val msg: String?, val data: JsonElement?) {

    /**
     * java class 调用转 class
     */
    @Throws(ApiException::class)
    fun <T> toBean(type: Type): T {
        val apiException = getApiException()
        if (apiException != null) throw apiException
        return fromJson(data, type)
    }


    /**
     * list
     */
    fun <T> toList(type: Type): MutableList<T> {
        val apiException = getApiException()
        if (apiException != null) throw apiException
        return fromJsonList(data, type)
    }

    /**
     * 分页数据
     */
    @Throws(ApiException::class)
    inline fun <reified T> toListModel(): T {
        val apiException = getApiException()
        if (apiException != null) throw apiException
        return fromJsonToListModel(data)
    }

    /**
     * 捕获异常信息
     */
    fun getApiException(): ApiException? {
        return when (code) {
            CodeConstant.ERROR_COMMON_CODE -> { // 公共的code
                ApiException(msg ?: msg ?: "", code)
            }
            CodeConstant.ERROR_TOKEN_INVALIDATION -> { // token 过期 退出登录
//                LiveBus.get<ExitAppEvent>(C.EventKey.KEY_EXIT_APP)
//                    .post(ExitAppEvent(code, msg ?: "token 过期，请重新登录"))
                ApiException(msg ?: "token过期，请重新登录", code)
            }
            CodeConstant.HTTP_SUCCESS -> { // 请求成功 但是 data 为 null
                if (data == null) ApiException("数据异常", CodeConstant.ERROR_DATA_NULL) else null
            }
            else -> {
                ApiException(msg ?: msg ?: "", code)
            }
        }
    }
}
